home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 November / EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso / earcd / unix / mp14tar.z / mp14tar / mpack / macnclip.c < prev    next >
C/C++ Source or Header  |  1994-06-01  |  6KB  |  214 lines

  1. /* macnclip.c -- clipboard window for nifty application library
  2.  *
  3.  * (C) Copyright 1990-1993 by Christopher J. Newman
  4.  * All Rights Reserved.
  5.  *
  6.  * Permission to use, copy, modify, distribute, and sell this software and its
  7.  * documentation for any purpose is hereby granted without fee, provided that
  8.  * the above copyright notice appear in all copies and that both that
  9.  * copyright notice and this permission notice appear in supporting
  10.  * documentation, and that the name of Christopher J. Newman not be used in
  11.  * advertising or publicity pertaining to distribution of the software without
  12.  * specific, written prior permission.  Christopher J. Newman makes no
  13.  * representations about the suitability of this software for any purpose.  It
  14.  * is provided "as is" without express or implied warranty.
  15.  *
  16.  * CHRISTOPHER J. NEWMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  17.  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT
  18.  * SHALL CHRISTOPHER J. NEWMAN BE LIABLE FOR ANY SPECIAL, INDIRECT OR
  19.  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
  20.  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  21.  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
  22.  * OF THIS SOFTWARE.
  23.  *
  24.  * Author:    Christopher J. Newman
  25.  * Message:    This is a nifty program.
  26.  */
  27.  
  28. #include "macnapp.h"
  29. #ifndef THINK_C
  30. #include <Resources.h>
  31. #include <Fonts.h>
  32. #include <Scrap.h>
  33. #endif
  34.  
  35. typedef struct clipinfo {
  36.     nate_win    winp;
  37.     Handle        data;
  38.     ResType        type, preftype;
  39.     short        scrapc;
  40.     Boolean        valid;
  41. } clipinfo;
  42.  
  43. /* handle to cliboard window */
  44. static na_win **cliph = (na_win**) NULL;
  45. static WORD    menuid, itemid;
  46.  
  47. /* function prototypes */
  48. static short clipclose(na_win*);
  49. static short clipupdate(na_win*, Boolean);
  50. static short cliptask(na_win*);
  51. static short clipinit(na_win*, long*);
  52.  
  53. #define cinfo    ((clipinfo *) winp)
  54. #define teinfo    ((nate_win *) winp)
  55.  
  56. /* close the clipboard window
  57.  */
  58. static short clipclose(winp)
  59.     na_win    *winp;
  60. {
  61.     Handle            hand;
  62.     
  63.     cliph = (na_win**) NULL;
  64.     if (menuid)    CheckItem(GetMHandle(menuid), itemid, false);
  65.     if ((hand = cinfo->data) != (Handle) NULL) {
  66.         DisposHandle(hand);
  67.     } else {
  68.         NATEclosep(winp);
  69.     }
  70.     
  71.     return (NA_CLOSED);
  72. }
  73.  
  74. /* update the clipboard window -- this does all the work
  75.  */
  76. #ifdef __STDC__
  77. static short clipupdate(na_win *winp, Boolean newsize)
  78. #else
  79. static short clipupdate(winp, newsize)
  80.     na_win    *winp;
  81.     Boolean            newsize;
  82. #endif
  83. {
  84.     long        len;
  85.     long                offset;
  86.     
  87.     if (!cinfo->valid) {
  88.         winp->ctrlp = NULL;
  89.         winp->activep = NULL;
  90.         winp->idlep = NULL;
  91.         winp->mousep = NULL;
  92.         winp->cursorp = NULL;
  93.         if (teinfo->vctrl != (ControlHandle) NULL) {
  94.             DisposeControl(teinfo->vctrl);
  95.             teinfo->vctrl = (ControlHandle) NULL;
  96.         }
  97.         if (winp->cursorRgn != (RgnHandle) NULL) {
  98.             DisposeRgn(winp->cursorRgn);
  99.             winp->cursorRgn = NULL;
  100.             if (winp->flags & NA_CURSORON) SetCursor(&QD(arrow));
  101.         }
  102.         cinfo->scrapc = InfoScrap()->scrapCount;
  103.         if (cinfo->data == (Handle) NULL) { 
  104.             cinfo->data = NewHandle(0);
  105.             if (MemError() != noErr) return (NA_NOTPROCESSED);
  106.         }
  107.         if ((len = GetScrap(cinfo->data, cinfo->type = cinfo->preftype, &offset)) <= 0) {
  108.             if ((len = GetScrap(cinfo->data, cinfo->type =
  109.                     (cinfo->preftype == 'TEXT' ? 'PICT' : 'TEXT'), &offset)) <= 0) {
  110.                 return (NA_NOTPROCESSED);
  111.             }
  112.         }
  113.         if (cinfo->type == 'TEXT') {
  114.             HLock(cinfo->data);
  115.             NATEinit(winp, NATE_READONLY | NATE_NOMOUSE | NATE_NOHSCROLL, 0, *cinfo->data, len);
  116.             winp->updatep = clipupdate;
  117.             winp->closep = clipclose;
  118.             winp->menup = NULL;
  119.             HUnlock(cinfo->data);
  120.             DisposHandle(cinfo->data);
  121.             cinfo->data = (Handle) NULL;
  122.         }
  123.         newsize = true;
  124.         cinfo->valid = true;
  125.     }
  126.  
  127.     if (cinfo->type == 'TEXT')  return (NATEupdatep(winp, newsize));
  128.     {
  129.         Rect    rtemp = (*(PicHandle)cinfo->data)->picFrame;
  130.         
  131.         DrawPicture((PicHandle) cinfo->data, &rtemp);
  132.     }
  133.     
  134.     return (NA_NOTPROCESSED);
  135. }
  136.  
  137. /* watch for the clipboard to change
  138.  */
  139. static short cliptask(winp)
  140.     na_win *winp;
  141. {
  142.     if (cinfo->scrapc != InfoScrap()->scrapCount) {
  143.         cinfo->valid = false;
  144.         InvalRect(&winp->pwin->portRect);
  145.     }
  146.     
  147.     return (NA_PROCESSED);
  148. }
  149.  
  150. /* initialize the clipboard window
  151.  */
  152. static short clipinit(winp, data)
  153.     na_win    *winp;
  154.     long    *data;
  155. {
  156.     cliph = (na_win**) RecoverHandle((Ptr) winp);
  157.     TextFont(monaco);
  158.     TextSize(9);
  159.     winp->type = NA_CLIPTYPE;
  160.     ShowWindow(winp->pwin);
  161.     winp->updatep = clipupdate;
  162.     winp->closep = clipclose;
  163.     winp->taskp = cliptask;
  164.     teinfo->vctrl = (ControlHandle) NULL;
  165.     
  166.     return (NA_PROCESSED);
  167. }
  168.  
  169. /* turn on/off the clipboard window
  170.  */
  171. #ifdef __STDC__
  172. void NAclipboard(Boolean show, ResType preftype)
  173. #else
  174. void NAclipboard(show, preftype)
  175.     Boolean    show;
  176.     ResType    preftype;
  177. #endif
  178. {
  179.     clipinfo    cinfob;
  180.     
  181.     if ((cliph == (na_win**) NULL && !show) || (cliph != (na_win**) NULL && show)) {
  182.         return;
  183.     }
  184.     if (!show) {
  185.         NAcloseWindow(NAlockWindow(cliph), NA_REQCLOSE);
  186.         return;
  187.     }
  188.     cinfob.data = (Handle) NULL;
  189.     cinfob.scrapc = 0;
  190.     cinfob.valid = false;
  191.     cinfob.preftype = preftype;
  192.     NAwindow(NAscreenrect(NA_VQUARTERSCN | NA_H3QUARTERSCN | NA_LEFTSCN | NA_BOTTOMSCN),
  193.         NA_USERESOURCE | NA_HASCONTROLS | NA_HILITECTRLS | NA_HASTASK | NA_CLOSEBOX | NA_GROWBOX
  194.         | NA_FORCESIZE | NA_COPYDATA, NULL, NA_CLIPWINDOW,
  195.         (long *) ((char *) &cinfob + sizeof (na_win)), sizeof (cinfob), clipinit);
  196. }
  197.  
  198. /* deal with a menu selection of the "Show/Hide Clipboard" item
  199.  */
  200. #ifdef __STDC__
  201. void NAclipboardMenu(WORD menu, WORD item, ResType preftype)
  202. #else
  203. void NAclipboardMenu(menu, item, preftype)
  204.     WORD    menu, item;
  205.     ResType    preftype;
  206. #endif
  207. {
  208.     Boolean        show;
  209.     
  210.     CheckItem(GetMHandle(menuid = menu), itemid = item,
  211.         show = (cliph == (na_win**) NULL ? true : false));
  212.     NAclipboard(show, preftype);
  213. }
  214.